﻿#pragma once

#include "Component.h"
#include "../include/robot_data.h"

class RobotHand;
class Robot : public Component
{
	Q_OBJECT

public:
	Robot(QObject *parent);
	~Robot();
	/*重连机械手*/
	bool Reconnecte(QByteArray& out);
	/*暂停机械手*/
	bool Pause();
	/*恢复机械手*/
	bool Resum();
	/*停止机械手*/
	bool Stop();

	/*设置DO*/
	bool SetDO(const QByteArray& input);
	bool SetDO(int index, bool val);
	/*复合指令*/
	bool SetGrip(int index);
	bool SetGrip(const QByteArray& input);
	/*移动指令*/
	bool MoveJL(const QList<MoveJLInfo>& moves);
	bool MoveJL(const QByteArray& input);

	/*获取机械手当前是否停止运行*/
	bool GetStopMoveState();
	/*获取机械手的当前坐标*/
	Position GetRobotCurrentPos();
	RobotInfo GetRobotStateInfo();
	// 注册订阅函数接口
	bool RegisterSubscriberFunction(int type, Callback callback) override;
	// 命令执行接口
	bool ExcuteCmd(int cmd, const QByteArray& input, QByteArray& output) override;

protected:
	// 组件初始化处理函数
	int ComponentInit(const QByteArray& param) override;
	/*自检接口*/
	bool ComponentCheckSelfState() override;
	/*复位接口*/
	bool ComponentSelfReset() override;
	/*系统状态响应接口*/
	void ResponseSystemState(int state) override;

private:
	void InitRobotState(bool connented);
	bool CheckPoints(const Position& pos, float rang);
	void ForbiddenSpaceProcess(const Position& pos);


private slots:
	// 连接状态更改信号, 0:连接 -1：状态断开断开 -2：连接端口端口 -3：同时断开
	void OnConnectionStateChanged(int state);
	// 执行点位ID信号
	void OnRobotHandPointId(int id);
	// TCP坐标信号
	void OnRobotHandJoints(const QString& joints);
	// 关节角度值信号
	void OnRobotHandTargets(const QString& targets);
	// 运动状态信息 0: 静止 1：运动
	void OnRobotHandMoving(int flag);
	// 夹具编号
	void OnRobotHandToolID(int id);
	// 错误码信号
	void OnRobotHandFaultCode(int code, const QString& err);
	// DI信息
	void OnRobotHandDIInfo(const QString& diInfo);
	// DO信息
	void OnRobotHandDOInfo(const QString& doInfo);

private:
	struct {
		QString id;
		Position origin;
		QList<Space3D> forbidden;
	} m_info = {};
	RobotInfo m_state = {};

	QMap<RobotMsgType, QVector<Callback>> m_subscribers;
	RobotHand* m_rob = nullptr;
};
